﻿import { MessageBox } from 'element-ui'
import formProcessProxy from '@/utils/client/formProcessProxy'

interface NotInExeCallback {
  () : void
}

interface ExeCallback {
  (formProcess: FormProcessProxy) : void
}

export default {
  IsInExe: function() {
    return typeof (formProcess) !== 'undefined'
  },
  ExeInvoke: function(InvokeFun: ExeCallback, BrowserFun? : NotInExeCallback) {
    if (!this.IsInExe()) {
      if (BrowserFun === undefined) {
        MessageBox.alert('使用此功能请在客户端打开！<br>(如果已在客户端，请点击右上角刷新本页面)', '提示', {
          dangerouslyUseHTMLString: true
        })
        return false
      } else {
        return BrowserFun()
      }
    }
    // return InvokeFun(formProcess)
    return InvokeFun(formProcessProxy)
  },
  /* 去除input两边空格 参数需初始注册存在 */
  checkTrim: function(value:any) {
    // eslint-disable-next-line eqeqeq
    if (value != '') {
      return value.replace(/(^\s*)|(\s*$)/g, '')
    }
    return value
  },
  /* 去除input所有空格 参数需初始注册存在 */
  checkAllTrim: function(value:any) {
    // eslint-disable-next-line eqeqeq
    if (value != '' && value != undefined) {
      return value.replace(/\s/g, '')
    }
    return ''
  },
  /* 截取指定长度字符串 */
  subString: function(str:any, num:any, type = 1) {
    if (str.length <= num) {
      return str
    }
    // eslint-disable-next-line no-var
    var str = str.substr(0, num)
    // eslint-disable-next-line eqeqeq
    if (type == 1) {
      str += '...'
    }
    return str
  },
  /* 转换指定长度小数 */
  decimals: function(number = 0, length = 0) {
    number = Number(number)
    // eslint-disable-next-line eqeqeq
    if (number == 0) {
      return number
    }
    const x = String(number).indexOf('.') + 1 // 小数点的位置
    if (x == 0) {
      return number
    }
    const y = String(number).length - x // 小数的位数
    if (y > length) {
      const value = Number(number)
      return value.toFixed(length)
    }
    return number
  },
  /* 验证输入框数字 */
  compare: function(value:any, min = 0, max = 99999999, length = 0) {
    // @ts-ignore
    if (min == 0 && max == 0 && max != '') {
      return 0
    }
    if (max == 0) {
      return 0
    }
    // value = value.replace(/[^\d]/g, '');
    value = Number(value)
    if (value != '') {
      value = this.decimals(value, length)
    }
    min = Number(min)

    if (value == '') {
      value = min
    }
    if (min > value) {
      value = min
    }
    // @ts-ignore
    if (max == '') {
      return value
    }
    max = Number(max)
    if (max < value) {
      value = max
    }
    return value
  },
  /* 检测转换数字 type 1整数 2 数字 */
  zhzs: function(value:any, num = 0, type = 1) {
    value = value.replace(/[^\d\.]/g, '')
    if (value != '') {
      if (type == 1) {
        value = parseInt(value)
      } else {
        value = this.decimals(value, 2)
      }
    }
    if (value == '') {
      value = num
    }
    return value
  },
  /**
   * 使用indexOf判断元素是否存在于数组中
   * @param {Object} arr 数组
   * @param {Object} value 元素值
   */
  isInArray: function(arr:any, value:any) {
    if (arr.indexOf && typeof (arr.indexOf) === 'function') {
      const index = arr.indexOf(value)
      if (index >= 0) {
        return true
      }
    }
    return false
  },
  // 类似PHP array_column
  array_column: function(array:any, columnName:any) {
    return array.map(function(value:any) {
      return value[columnName]
    })
  },
  /**
   * 加法运算，避免数据相加小数点后产生多位数和计算精度损失。
   *
   * @param num1加数1 | num2加数2
   */
  numAdd: function(num1:any, num2:any) {
    let baseNum, baseNum1, baseNum2
    try {
      baseNum1 = num1.toString().split('.')[1].length
    } catch (e) {
      baseNum1 = 0
    }
    try {
      baseNum2 = num2.toString().split('.')[1].length
    } catch (e) {
      baseNum2 = 0
    }
    baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
    return (num1 * baseNum + num2 * baseNum) / baseNum
  },
  /**
   *减法运算，避免数据相减小数点后产生多位数和计算精度损失。
   * num1 - num2
   * @param num1被减数  |  num2减数
   */
  numSub: function(num1:any, num2:any) {
    let baseNum, baseNum1, baseNum2
    let precision// 精度
    try {
      baseNum1 = num1.toString().split('.')[1].length
    } catch (e) {
      baseNum1 = 0
    }
    try {
      baseNum2 = num2.toString().split('.')[1].length
    } catch (e) {
      baseNum2 = 0
    }
    baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
    precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2
    return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision)
  },
  /**
   * 乘法运算，避免数据相乘小数点后产生多位数和计算精度损失。
   *
   * @param num1被乘数 | num2乘数
   */
  numMulti: function(num1:any, num2:any) {
    num1 = Number(num1)
    num2 = Number(num2)
    if (num1 == 0 || num2 == 0) {
      return 0
    }

    let baseNum = 0
    try {
      baseNum += num1.toString().split('.')[1].length
    } catch (e) {
    }
    try {
      baseNum += num2.toString().split('.')[1].length
    } catch (e) {
    }
    return Number(num1.toString().replace('.', '')) * Number(num2.toString().replace('.', '')) / Math.pow(10, baseNum)
  },
  /**
   * 除法运算，避免数据相除小数点后产生多位数和计算精度损失。
   *  num1 / num2
   * @param num1被除数 | num2除数
   */
  numDiv: function(num1:any, num2:any) {
    let baseNum1 = 0; let baseNum2 = 0
    let baseNum3, baseNum4
    try {
      baseNum1 = num1.toString().split('.')[1].length
    } catch (e) {
      baseNum1 = 0
    }
    try {
      baseNum2 = num2.toString().split('.')[1].length
    } catch (e) {
      baseNum2 = 0
    }

    baseNum3 = Number(num1.toString().replace('.', ''))
    baseNum4 = Number(num2.toString().replace('.', ''))
    return (baseNum3 / baseNum4) * Math.pow(10, baseNum2 - baseNum1)
  },
  /**
   * 格式化字节大小
   * @param number $size 字节数
   * @param string $delimiter 数字和单位分隔符
   * @return string 格式化后的带单位的大小
   */
  diskTransform: function(value:any) {
    if (value == null || value == '') {
      return '0'
    }
    const unitArr = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
    let index = 0
    const srcsize = parseFloat(String(Math.abs(value)))
    index = Math.floor(Math.log(srcsize) / Math.log(1024))
    let size: any = srcsize / Math.pow(1024, index)
    size = size.toFixed(2)// 保留的小数位数
    size = value > 0 ? size : '-' + size
    return size + unitArr[index]
  },
  /**
   * 数组去重
   * @param arr 需要去重的数组
   * @returns 去重后的数组
   */
  uniqueArray: function(arr: any) {
    const res = []
    for (const i in arr) {
      if (res.indexOf(arr[i]) === -1) {
        res.push(arr[i])
      }
    }
    return res
  },
  /**
   * 验证邮箱规则
   * @param szMail
   */
  checkEmailAddress(szMail: string) {
    const szReg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,5}$/
    return szReg.test(szMail)
  }
}
